package com.xxxtea.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.xxxtea.cf.RecommendItem;
import com.xxxtea.common.anno.DeserializeOnly;
import com.xxxtea.dto.BaseProduct;
import com.xxxtea.mpe.annotation.Constraint;
import com.xxxtea.mpe.annotation.ExtendQuery;
import com.xxxtea.mpe.handler.AttachmentHandler;
import com.xxxtea.mpe.handler.AttachmentListHandler;
import com.xxxtea.mpe.model.Attachment;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.Date;
import java.util.List;

/**
 * 菜品实体类
 * 
 * 用于存储菜品的基本信息，包括：
 * - 菜品基本信息（名称、描述、价格等）
 * - 菜品图片管理
 * - 库存和销量管理
 * - 评分和推荐功能
 * - 商家信息关联
 * - 分类信息关联
 * 
 * 实现RecommendItem接口，支持推荐系统
 * 使用MyBatis-Plus注解进行数据库映射
 * 使用Swagger注解进行API文档生成
 * 
 * @author badman
 * @since 1.0.0
 */
@Data
@ApiModel("菜品")
@TableName(autoResultMap = true)
public class Dish implements RecommendItem {

	/**
	 * 主键ID
	 * 使用自增策略
	 */
	@ApiModelProperty("主键")
	@TableId(value = "id", type = IdType.AUTO)
	private Integer id;

	/**
	 * 商家ID
	 * 关联Merchant表
	 */
	@ApiModelProperty("商家ID")
	@Constraint(referenceClass = Merchant.class)
	private Integer merchantId;

	/**
	 * 分类ID
	 * 关联DishCategory表
	 */
	@ApiModelProperty("分类ID")
	@Constraint(referenceClass = DishCategory.class)
	private Integer categoryId;

	/**
	 * 菜品名称
	 * 支持模糊查询
	 */
	@TableField(condition = SqlCondition.LIKE)
	@ApiModelProperty("菜品名称")
	private String name;

	/**
	 * 菜品描述
	 * 菜品的详细描述信息
	 */
	@ApiModelProperty("描述")
	private String description;

	/**
	 * 菜品主图
	 * 使用自定义处理器处理单个附件
	 */
	@ApiModelProperty("菜品主图")
	@TableField(typeHandler = AttachmentHandler.class)
	private Attachment image;

	/**
	 * 菜品图片列表
	 * 使用自定义处理器处理附件列表
	 */
	@ApiModelProperty("菜品图片")
	@TableField(typeHandler = AttachmentListHandler.class)
	private List<Attachment> images;

	/**
	 * 菜品价格
	 * 菜品的售价
	 */
	@ApiModelProperty("价格")
	private Double price;

	/**
	 * 库存数量
	 * 当前可售的库存数量
	 */
	@ApiModelProperty("库存")
	private Integer stock;

	/**
	 * 销量
	 * 累计销售数量
	 */
	@ApiModelProperty("销量")
	private Integer sales;

	/**
	 * 评分
	 * 用户对菜品的平均评分
	 */
	@ApiModelProperty("评分")
	private Double rating;

	/**
	 * 是否热销
	 * 0-否 1-是
	 */
	@ApiModelProperty("是否热销 0-否 1-是")
	private Boolean isHot;

	/**
	 * 是否新品
	 * 0-否 1-是
	 */
	@ApiModelProperty("是否新品 0-否 1-是")
	private Boolean isNew;

	/**
	 * 折扣率
	 * 菜品的折扣比例
	 */
	@ApiModelProperty("折扣率")
	private Double discount;

	/**
	 * 创建时间
	 * 自动填充插入时间
	 */
	@ApiModelProperty("创建时间")
	@TableField(fill = FieldFill.INSERT)
	private Date createTime;

	/**
	 * 更新时间
	 * 自动填充插入和更新时间
	 */
	@ApiModelProperty("更新时间")
	@TableField(fill = FieldFill.INSERT_UPDATE)
	private Date updateTime;

	/**
	 * 商家名称
	 * 扩展查询字段，关联商家表获取商家名称
	 */
	@ExtendQuery(referenceClass = Merchant.class, targetColumn = "name")
	private String merchantName;

	/**
	 * 商家头像
	 * 扩展查询字段，关联商家表获取商家头像
	 * 启用资源处理
	 */
	@ExtendQuery(referenceClass = Merchant.class, targetColumn = "avatar", enableResource = true)
	private String merchantAvatar;

	/**
	 * 分类名称
	 * 扩展查询字段，关联分类表获取分类名称
	 */
	@ExtendQuery(referenceClass = DishCategory.class, targetColumn = "name")
	private String categoryName;

	/**
	 * 推荐分数
	 * 仅用于反序列化，推荐系统使用
	 */
	@DeserializeOnly
	private Double score;

	/**
	 * 最低价格
	 * 仅用于反序列化，查询条件
	 */
	@DeserializeOnly
	private Double minPrice;

	/**
	 * 最高价格
	 * 仅用于反序列化，查询条件
	 */
	@DeserializeOnly
	private Double maxPrice;

	/**
	 * 最低评分
	 * 仅用于反序列化，查询条件
	 */
	@DeserializeOnly
	private Double minRating;

	/**
	 * 是否已收藏
	 * 非数据库字段，用于前端显示
	 */
	@TableField(exist = false)
	private boolean collect;

	/**
	 * 商家信息
	 * 非数据库字段，用于关联查询商家详细信息
	 */
	@TableField(exist = false)
	private Merchant merchant;

	/**
	 * 评价列表
	 * 非数据库字段，用于关联查询评价信息
	 */
	@TableField(exist = false)
	private List<Review> reviewList;
}
